import os
import subprocess

def pcap2json(input_pcap_path, output_json_path=None, protocol_name=None):
    """
    将单个PCAP文件解析为JSON格式
    
    :param input_pcap_path: 输入的PCAP文件路径
    :param output_json_path: 输出的JSON文件路径（可选，默认与PCAP同目录）
    :param protocol_name: 指定协议名称（如'tls', 'modbus'），若为None则自动检测
    :return: JSON文件路径
    """
    # 检查输入文件是否存在
    if not os.path.exists(input_pcap_path):
        raise FileNotFoundError(f"PCAP文件不存在: {input_pcap_path}")

    # 设置默认输出路径（与PCAP同目录，后缀改为.json）
    if output_json_path is None:
        pcap_dir = os.path.dirname(input_pcap_path)
        pcap_name = os.path.splitext(os.path.basename(input_pcap_path))[0]
        output_json_path = os.path.join(pcap_dir, f"{pcap_name}.json")

    # 构建tshark命令
    if protocol_name and protocol_name.lower() == 'modbus':
        cmd = f'tshark -T json -J "mbtcp modbus" -x -r "{input_pcap_path}" > "{output_json_path}"'
    elif protocol_name:
        cmd = f'tshark -T json -J "{protocol_name}" -x -r "{input_pcap_path}" > "{output_json_path}"'
    else:
        cmd = f'tshark -T jsonraw -x -r "{input_pcap_path}" > "{output_json_path}"'

    # 执行命令
    try:
        subprocess.run(cmd, shell=True, check=True)
        print(f"成功解析: {input_pcap_path} -> {output_json_path}")
        return output_json_path
    except subprocess.CalledProcessError as e:
        print(f"解析失败: {e}")
        return None

# 示例用法
if __name__ == "__main__":
    # 示例1：自动检测协议
    pcap2json("tls.pcap")
    
    # 示例2：指定TLS协议解析
    # pcap2json("tls_traffic.pcap", "tls_output.json", "tls")
    
    # # 示例3：解析Modbus协议
    # pcap2json("modbus.pcap", protocol_name="modbus")